package server;

/*
 * Copyright (c) 1996, 1996, 1997 Sun Microsystems, Inc. All Rights Reserved.
 * 
 * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
 * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
 * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
 * THIS SOFTWARE OR ITS DERIVATIVES.
 * Minor modifications by ML 20001117
 */

import java.io.*;
import java.net.*;
import java.rmi.RMISecurityManager;

/**
 * The ClassFileServer implements a ClassServer that
 * reads class files from the file system. See the
 * doc for the "Main" method for how to run this
 * server.
 */
public class ClassFileServer extends ClassServer {
    
    private String classpath;
    
    private static int DefaultServerPort = 2001;
    
    /**
     * Constructs a ClassFileServer.
     *
     * @param classpath the classpath where the server locates classes
     */
    public ClassFileServer(int port, String classpath) throws IOException
    {
		super(port);
		this.classpath = classpath;
    }

    /**
     * Returns an array of bytes containing the bytecodes for
     * the class represented by the argument path.
     * The path is a dot separated class name with
     * the ".class" extension removed.
     *
     * @return the bytecodes for the class
     * @exception ClassNotFoundException if the class corresponding
     * to path could not be loaded.
     */
    public byte[] getBytes(String path) throws IOException, ClassNotFoundException 
    {
		System.out.println("reading: " + path);
		File f = new File(classpath + File.separator +
				  path.replace('.', File.separatorChar) + ".class");
		int length = (int)(f.length());
		if (length == 0) {
		    throw new IOException("File length is zero: " + path);
		} else {
		    FileInputStream fin = new FileInputStream(f);
		    DataInputStream in = new DataInputStream(fin);
		    
		    byte[] bytecodes = new byte[length];
		    in.readFully(bytecodes);
		    return bytecodes;
		}
    }

    /**
     * Main method to create the class server that reads
     * class files. This takes two command line arguments, the
     * port on which the server accepts requests and the
     * root of the classpath. To start up the server: 
     *
     *    java ClassFileServer  
     * 
     *
     * The codebase of an RMI server using this webserver would
     * simply contain a URL with the host and port of the web
     * server (if the webserver's classpath is the same as
     * the RMI server's classpath): 
     *
     *    java -Djava.rmi.server.codebase=http://zaphod:2001/ RMIServer
     *  
     *
     * You can create your own class server inside your RMI server
     * application instead of running one separately. In your server
     * main simply create a ClassFileServer: 
     *
     *    new ClassFileServer(port, classpath);
     * 
     *
    public static void main(String args[]) 
    {
		int port = DefaultServerPort;
		String classpath = "";
		
		if (args.length >= 1) {
		    port = Integer.parseInt(args[0]);
		}
	
		if (args.length >= 2) {
		    classpath = args[1];
		}
		
		if(System.getSecurityManager() == null)  {
	         System.setSecurityManager (new RMISecurityManager());
	    }
		
		try {
		    new ClassFileServer(port, classpath);
		} catch (IOException e) {
		    System.out.println("Unable to start ClassServer: " +
				       e.getMessage());
		    e.printStackTrace();
		}
    }*/
}
